<?php

/* 27/07/2011

   En este modulo llevaran a cabo los servicio para el usuario
   que seran llamados por el servicio web (Representational State Transfer)

 -trim       = elimina espacion en blanco en la cadena a los extremos.
 -strtolower = toda la cadena a minuscula.

 */

class json_servicio_usuarioActions extends sfActions
{

public function executeGet_users_by_pk_in_array(sfWebRequest $request){

   /* ejemplo (en la url falta el token)
    http://localhost/practil/web/frontend_dev.php/json_servicio_usuario/get_users_by_pk_in_array?list_pk[]=11&list_pk[]=12&list_pk[]=13
    */
    $request->setRequestFormat('json');
    $list             = $request->getParameter('list_pk');
    $token_security   = $request->getParameter('token');
    $recurso = new myLib();
    if($recurso->executeToken($token_security)){
        if(count($list)>0){
            $criterio_list = new Criteria();
            for($i=0;$i<count($list);$i++){
                $criterio_list->addOr(UsuarioPeer::ID,$list[$i]);
            }
            $lista_usuarios = UsuarioPeer::doSelect($criterio_list);
            $this->list=$lista_usuarios;
            $this->success = true;
            return sfView::SUCCESS;
        }else{
            $this->success = false;
            $this->code_rpt = 'j-4444444';
            $this->message = 'sin valores';
            return sfView::ERROR;
        }

    }else{
            $this->success = false;
            $this->code_rpt = 20001;
            $this->message = 'token de seguridad incorrecto';
            return sfView::ERROR;
    } 
}

public function executeGet_user_by_id(sfWebRequest $request){

   /* ejemplo (en la url falta el token)
    http://localhost/practil/web/frontend_dev.php/json_servicio_usuario/get_user_by_pk?id=11
    */
    $request->setRequestFormat('json');
    $id             = $request->getParameter('id');
    $token_security   = $request->getParameter('token');
    $recurso = new myLib();
    if($id!='' && $token_security!=''){
        if($recurso->executeToken($token_security)){

            $criterio = new Criteria();
            $criterio->add(UsuarioPeer::ID,$id);
            $usuario = UsuarioPeer::doSelectOne($criterio);
            if(is_object($usuario)){
                $this->user=$usuario;
                $this->success = true;
                return sfView::SUCCESS;
            }else{
                $this->success = false;
                $this->code_rpt = 20003;
                $this->message = 'User Not Found!!';
                return sfView::ERROR;
            }
        }else{
            $this->success = false;
            $this->code_rpt = 20001;
            $this->message = 'token de seguridad incorrecto';
            return sfView::ERROR;
        }
    }else{
        $this->success = false;
        $this->code_rpt = 20002;
        $this->message = 'Bad Request';
        return sfView::ERROR;
    }
}

public function executeGet_users_by_name_like(sfWebRequest $request){
    /* ejemplo (en la url falta el token)
    http://localhost/practil/web/frontend_dev.php/json_servicio_usuario/get_users_by_name_like?name=foo bár
    */
    $request->setRequestFormat('json');
    $name             = $request->getParameter('name');
    $token_security   = $request->getParameter('token');
    $recurso = new myLib();
    if($name!='' && $token_security!=''){
        if($recurso->executeToken($token_security)){
                $c = new Criteria();
                $criterion = $c->getNewCriterion(UsuarioPeer::NOMBRE, '%'.$name.'%', Criteria::LIKE);
                $criterion2 = $c->getNewCriterion(UsuarioPeer::APELLIDO, '%'.$name.'%', Criteria::LIKE);
                $criterion->addOr($criterion2);
                $c->add($criterion);
                $lista_usuarios = UsuarioPeer::doSelect($c);
                $this->list=$lista_usuarios;
                $this->success = true;
                return sfView::SUCCESS;
        }else{
            $this->success = false;
            $this->code_rpt = 20001;
            $this->message = 'token de seguridad incorrecto';
            return sfView::ERROR;
        }
    }else{
        $this->success = false;
        $this->code_rpt = 20002;
        $this->message = 'Bad Request';
        return sfView::ERROR;
    }
}

public function executeAccount_confirmation(sfWebRequest $request){


    $request->setRequestFormat('json');
    $email            = trim($request->getParameter('email'));
    $token_account    = trim($request->getParameter('token_account'));
    $token_security   = $request->getParameter('token_platform');
    $recurso = new myLib();


    if($recurso->executeToken($token_security)){
        
        $criterio_obtener_usuario = new Criteria();
        $criterio_obtener_usuario->add(UsuarioPeer::EMAIL,$email);
        $criterio_obtener_usuario->add(TmpUsuarioRegistroPeer::TOKEN,$token_account);
        $criterio_obtener_usuario->addJoin(UsuarioPeer::ID, TmpUsuarioRegistroPeer::USUARIO_ID);
        
        $bean_temporal_usuario_registro = TmpUsuarioRegistroPeer::doSelectOne($criterio_obtener_usuario);
        
        if(is_object($bean_temporal_usuario_registro)){
            
            $fecha_registro = new DateTime($bean_temporal_usuario_registro->getFechaActualizacion());
            $fecha_registro =$fecha_registro->format('Y-m-d');
            $fecha_registro = date($fecha_registro);
            $fecha_actual = mktime(0,0,0,date('m'),date("d")-7,date('Y'));
            $fecha_actual = date('Y-m-d',$fecha_actual);
            
            if($fecha_registro>=$fecha_actual){                
                $bean_temporal_usuario_registro->delete();
                $this->success = true;
                $this->code = 'j-1003';
                $this->message = 'success';            
            }else{

                try{                    
                     $con = Propel::getConnection();
                     $con->beginTransaction();
                     $criterio_usuario = new Criteria();
                     $criterio_usuario->add(UsuarioPeer::ID,$bean_temporal_usuario_registro->getUsuarioId());
                     $usuario_delete = UsuarioPeer::doSelectOne($criterio_usuario);
                     $criterio_auditoria = new Criteria();
                     $criterio_auditoria->add(UsuarioAuditoriaPeer::USUARIO_ID,$usuario_delete->getId());
                     $auditoria_delete = UsuarioAuditoriaPeer::doSelectOne($criterio_auditoria);

                     $bean_temporal_usuario_registro->delete();
                     $auditoria_delete->delete();
                     $usuario_delete->delete();                     
                     $con->commit();
                     
                     $this->success = false;
                     $this->code = 'j-1004';
                     $this->message = 'expiro token de validacion';
                }catch (Exception $e){
                     $con->rollBack();
                     $this->success = false;
                     $this->code = 'j-1005';
                     $this->message = 'error al eliminar archivo => '.$e->getMessage();
                }
            
            }
            
        }else{
            $this->success = false;
            $this->code = 'j-1002';
            $this->message = 'user y/o token incorrecto';
        }

    }else{
            $this->success = false;
            $this->code = 'j-1001';
            $this->message = 'token de la aplicacion invalido';
    }
     


}

/* 12 de obtubre 2011
   Metodo de registrar a usuario practil
  
 */

public function executeRegistrar(sfWebRequest $request)
{
    $request->setRequestFormat('json');
    //obteniedo los datos
    $nombre          = $request->getParameter('nombre');
    $apellido        = $request->getParameter('apellido');
    $password        = $request->getParameter('password');
    $email           = $request->getParameter('email');
    $plataforma      = $request->getParameter('plataforma');
    $tipo_registro   = $request->getParameter('tipo_registro');
    $token_seguridad = $request->getParameter('token');
    $recurso = new myLib();

    //verificando si el codigo es correcto
    if($recurso->executeToken($token_seguridad)){
        if($recurso->executeVerificar($email)){
            if($recurso->executeVerificar_associate($email)){
                   if($recurso->executeVerificarPlataforma($plataforma)){
                            //si esta disponible valido datos
                            $vEmail = new sfValidatorEmail(array('required'=>true));
                            $vString= new sfValidatorString(array('required'=>true));

                            try {
                            $vEmail->clean(strtolower(trim($email)));
                            } catch (sfValidatorError $exc){
                               $this->success = false;
                               $this->code_rpt = 20002;
                               $this->message = 'email-no valido';
                               return sfView::ERROR;
                            }
                            try {
                            $vString->clean(strtolower(trim($plataforma)));
                            } catch (sfValidatorError $exc) {
                               $this->success = false;
                               $this->code_rpt = 20002;
                               $this->message = 'plataforma no valido';
                               return sfView::ERROR;
                            }
                            try {
                            $vString->clean($password);
                            } catch (sfValidatorError $exc) {
                               $this->success = false;
                               $this->code_rpt = 20002;
                               $this->message = 'password no valido';
                               return sfView::ERROR;
                            }
                            try {
                                     // si no entro en los  catch
                                    $con = Propel::getConnection();
                                    $con->beginTransaction();
                                    $nuevo_usuario = new Usuario();
                                    $nuevo_usuario->setNombre    ( strtolower(trim($nombre)) );
                                    $nuevo_usuario->setApellido  ( strtolower(trim($apellido)) );
                                    $nuevo_usuario->setEmail     ( strtolower(trim($email)) );
                                    $nuevo_usuario->setPassword  ( $password );
                                    $nuevo_usuario->setPlataforma( $plataforma.'-' );
                                    $nuevo_usuario->setNacionalidad ("");
                                    $nuevo_usuario->setLocalidad("");
                                    $nuevo_usuario->setSexo("");
                                    $nuevo_usuario->setFechaNacimiento("01-01-1980");
                                    $nuevo_usuario->setIdioma ("ES");
                                    $nuevo_usuario->setUsuarioTipoId(1);
                                    $nuevo_usuario->setFlag("");
                                    $nuevo_usuario->save();

                                    //el token para que pueda activar su cuenta
                                    /*Tipo de confirmacion:
                                     1=nesecita confirmacion
                                     2=sin confirmacion
                                     */
                                    if($tipo_registro==1){
                                        $token = new TmpUsuarioRegistro();
                                        $token_aux = md5(rand(100000,999999));
                                        $token->setToken($token_aux);
                                        $token->setFechaActualizacion(time());
                                        $token->setUsuarioId($nuevo_usuario->getId());
                                        $token->save();
                                    }else{
                                        $token_aux='null';
                                    }


                                    //registro los datos
                                    $auditoria = new UsuarioAuditoria();
                                    $auditoria->setFechaRegistro(time());
                                    $auditoria->setFechaActualizacion(time());
                                    $auditoria->setUsuarioId($nuevo_usuario->getId());
                                    $auditoria->save();
                                    $con->commit();

                                        $this->success = true;
                                        $this->code_rpt = '10004';
                                        $this->id =  $nuevo_usuario->getId();
                                        $this->token =  $token_aux;
                                        $this->message = 'registro exitoso';
                                        return sfView::SUCCESS;
                                    
                            }catch (sfValidatorError $exc) {
                               $con->rollBack();
                               $this->success = false;
                               $this->code_rpt = 10003;
                               $this->message = 'error al intentar grabar el usuario';
                               return sfView::ERROR;
                            }

                        }else{
                            $this->success = false;
                            $this->code_rpt = 10005;
                            $this->message = 'plataforma no existe';
                            return sfView::ERROR;
                            }
            }else{
               $this->success = false;
               $this->code_rpt = 'p-20009';;
               $this->message = 'e-mail se encuentra asocciado a una cuenta';
               return sfView::ERROR;
            }
        }else{
            $this->success = false;
            $this->code_rpt = 'p-10003';
            $this->message = 'e-mail en cuenta principal ya existe';
            return sfView::ERROR;
        }
    }else{
        $this->success = false;
        $this->code_rpt = 20001;
        $this->message = 'token de seguridad incorrecto';
        return sfView::ERROR;
    }
}


public function executeRegisterPackage(sfWebRequest $request){
    
    $request->setRequestFormat('json');
    $recurso            = new myLib();
    $servicioPaquete    = new PacketService();
    $servicioPlataforma = new PlatformValidator();

    $tokenSeguridad   = $request->getParameter('token');
    $plataformaId     = $request->getParameter('plataformaId');
    $userId           = $request->getParameter('userId');
    $typePackage      = $request->getParameter('paqueteId');
    $accessSecurity   = "";
    //verificando si el codigo es correcto
    if($recurso->executeToken($tokenSeguridad))
    {
        $successPaquete = $servicioPlataforma->PlatformExists($plataformaId);
        if($successPaquete['success'])
        {
             if($successPaquete['object']->getDescripcion()=="aceptor"){
                  $respt = $servicioPaquete->RegisterPackageAceptor($userId, $plataformaId, $accessSecurity, $typePackage);
             }else{
                 $this->message = "{<action>}->error action if equals description";
                 return sfView::ERROR;
             }

             //-----------------------------------------------//
                 if($respt['success'])
                 {
                     $this->info  = $successPaquete['object'];
                     return sfView::SUCCESS;
                 }else
                 {
                     $this->message = $respt['message'];
                     return sfView::ERROR;
                 }
        }
    }else
    {
        $this->message = "token invalid";
        return sfView::ERROR;
    }


}


public function executeLogin(sfWebRequest $request)
{
    $request->setRequestFormat('json');    
   
    $email           = $request->getParameter('email');
    $password        = $request->getParameter('password');
    $token_seguridad = $request->getParameter('token_platform');
    $plataforma      = $request->getParameter('plataforma');

    $recurso = new myLib();

    try {

        //verificando si el codigo es correcto
        if($recurso->executeToken($token_seguridad)){
            $criterio = new Criteria();
            $criterio->add(UsuarioPeer::EMAIL,    $email);
            $criterio->add(UsuarioPeer::PASSWORD, $password);
            //verificado si la el usuario y la constraseña es correcta
            if(UsuarioPeer::doCount($criterio)>0){
                $user  =  UsuarioPeer::doSelectOne($criterio);
                
                //verificar si el usuario no se ecuentra la la tabla tmp_usuario_registro
                //si en caso se encontrara ahi ...significa que el usuario se registro pero
                //no verifico su cuenta en su correo
             $crite = new Criteria();
             $crite->add(TmpUsuarioRegistroPeer::USUARIO_ID,$user->getId());

             if(TmpUsuarioRegistroPeer::doCount($crite)==0){
                  
                  $respuesta = $recurso->verificar_por_plataforma($email,$plataforma);

                   if($respuesta==2){
                        //Usuario disponible-Actualizar
                        $this->message = 'El usuario no existe en la plataforma';
                        $this->tokenpk = $user->getId();
                        $this->code_rpt = 'p-10004';
                        return sfView::ERROR;
                    }else{
                        //Usuario existe en Practil y existe en plataflorma
                        $this->message = 'Ingreso correctamente';
                        $this->user = $user;
                        $this->token = md5(rand(0,100));
                        $this->code_rpt = 'p-10005';
                        return sfView::SUCCESS;
                    }
                 
                       return sfView::ERROR;
                }else{
                   $tmp_user =  TmpUsuarioRegistroPeer::doSelectOne($crite);
                   $this->token = $tmp_user->getToken();
                   $this->message = 'El usuario no a verificado su email';
                   $this->code_rpt = 'p-10006';
                   return 'Verificacion';
                }
            }else{
                $this->message = 'usuario y constraseña incorrecta';
                $this->code_rpt = 'p-10007';
                $this->tokenpk = null;
                return sfView::ERROR;
            }
        }else{
               $this->message = 'token incorrecto';
               $this->code_rpt = 'p-10008';
               $this->tokenpk = null;
               return sfView::ERROR;
        }
    }catch (sfValidatorError $exc){
               $this->message = 'error interno consulta fallida';
               $this->code_rpt = 'p-10009';
               $this->tokenpk = null;
               return sfView::ERROR;
     }



}




public function executeAsociar_plataforma(sfWebRequest $request){
   
    $request->setRequestFormat('json');

    $email           = $request->getParameter('email');
    $plataforma      = $request->getParameter('plataforma');
    $token_seguridad = $request->getParameter('token');
    $recurso = new myLib();

    //verificando si el codigo es correcto
    if($recurso->executeToken($token_seguridad)){
            if($recurso->executeVerificarPlataforma($plataforma)){
          //si esta disponible valido datos
            $vEmail = new sfValidatorEmail(array('required'=>true));
            $vString= new sfValidatorString(array('required'=>true));

            try {
            $vEmail->clean(strtolower(trim($email)));
            } catch (sfValidatorError $exc) {
                $this->success = false;
                $this->code_rpt = 20002;
                $this->message = 'email-no valido';
                return sfView::ERROR;
            }
            try {
            $vString->clean(strtolower(trim($plataforma)));
            } catch (sfValidatorError $exc) {
                $this->success = false;
                $this->code_rpt = 20002;
                $this->message = 'plataforma no valido';
                return sfView::ERROR;
            }

            try {
                     // si no entro en los  catch
                    $con = Propel::getConnection();
                    $con->beginTransaction();
                    $criterio = new Criteria();
                    $criterio->add(UsuarioPeer::EMAIL,'%'.$email.'%',Criteria::LIKE);
                    $usuario = UsuarioPeer::doSelectOne($criterio);
                    $usuario->setPlataforma($usuario->getPlataforma().$plataforma.'-' );
                    $usuario->save();
                    $criterio->clear();
                    //actualizo datos
                    $criterio->add(UsuarioAuditoriaPeer::USUARIO_ID,$usuario->getId());
                    $auditoria = UsuarioAuditoriaPeer::doSelectOne($criterio);
                    if(is_object($auditoria)){
                        $auditoria->setFechaActualizacion(time());
                        $auditoria->save();
                    }else{
                         $auditoria = new UsuarioAuditoria();
                         $auditoria->setFechaRegistro(time());
                         $auditoria->setFechaActualizacion(time());
                         $auditoria->setUsuarioId($usuario->getId());
                         $auditoria->save();
                    }
                    
                    $con->commit();

                    $this->success = true;
                    $this->code_rpt = 10009;
                    $this->id =  $usuario->getId();
                    $this->message = 'asociacion exitosa';
                    return sfView::SUCCESS;
                    
            }catch (sfValidatorError $exc) {
               $con->rollBack();
               $this->success = false;
               $this->code_rpt = 20008;
               $this->message = 'error al asociar usuario';
               return sfView::ERROR;
            }

        }else{
            $this->success = false;
            $this->code_rpt = 20002;
            $this->message = 'plataforma no encontrado';
            return sfView::ERROR;
            }
    }else{
        $this->success = false;
        $this->code_rpt = 20002;
        $this->message = 'token  no valido';
        return sfView::ERROR;
    }

}



public function executeUserInformationPacket(sfWebRequest $request){
    $request->setRequestFormat('json');
    $servicioPaquete = new PacketService();
    $userId          = $request->getParameter('user_id');
    $plataformaId    = $request->getParameter('plataforma_id');
    $accessSecurity  = $request->getParameter('security');
    $array_respt     = $servicioPaquete->DataUser($userId, $plataformaId, $accessSecurity);
    $head = false;
    if($array_respt['success']){
        //envio informacion del paquete
            $this->paquete = $array_respt['paquete'];
        //envio informacion del detalle
        ////verifico antes por que puede que exista un paquete sin detalle
        if(!$array_respt['detalle']){
            $this->listDetalle = false;
        }else{
            $this->listDetalle = $array_respt['detalle'];
        }
        $head = true;
    }else{    
        $this->message= $array_respt['message'];
    }

    $this->head= $head;
    if($head){
        return sfView::SUCCESS;
    }else{
        return sfView::ERROR;
    }

}

public function executeGenerateTokenForgetPassword(sfWebRequest $request){

        $request->setRequestFormat('json');
        
        $user_id        = $request->getParameter('userId');
        $plataforma_key = $request->getParameter('plataformaKey');
        $token          = $request->getParameter('tokenSecurity');

        $lib = new myLib();
        $usuario = $lib->executeRetorna_usuario($user_id);

        if($lib->executeToken($token)){
            if($lib->executeVerificarPlataforma($plataforma_key)){
                    if($usuario!=null){
                          $token    =  $user_id.md5(time()).md5(rand(1, 1000));
                          $expirate =   mktime(0,0,0,date('m'),date("d")+7,date('Y'));

                          $dominio_token = new DominioToken();
                          $dominio_token->setTable('tb_forget_password');
                          $dominio_token->setToken($token);
                          $dominio_token->setUsuarioId($user_id);
                          $dominio_token->setCreateAt(time());
                          $dominio_token->setExpirateAt($expirate);
                          $dominio_token->save();
                        
                          return sfView::SUCCESS;
                     }else{
                           $this->success = false;
                           $this->code_rpt = 20001;
                           $this->message = 'usuario no valido';
                           return sfView::ERROR;
                      }
            }else{
                $this->success = false;
                $this->code_rpt = 20002;
                $this->message = 'plataforma  no valido';
                return sfView::ERROR;
            }

        }else{
            $this->success = false;
            $this->code_rpt = 20003;
            $this->message = 'token  no valido';
            return sfView::ERROR;
        }
        
}


public function executePre_login(sfWebRequest $request)
{
    $request->setRequestFormat('json');

    $email           = $request->getParameter('email');
    $token_seguridad = $request->getParameter('token_platform');


    $recurso = new myLib();

    try {

        //verificando si el codigo es correcto
        if($recurso->executeToken($token_seguridad)){
            $criterio = new Criteria();
            $criterio->add(UsuarioPeer::EMAIL, strtolower(trim($email)));
            //verificado si la el usuario  es correcto
            if(UsuarioPeer::doCount($criterio)>0){
                $user  =  UsuarioPeer::doSelectOne($criterio);

                //verificar si el usuario no se ecuentra la la tabla tmp_usuario_registro
                //si en caso se encontrara ahi ...significa que el usuario se registro pero
                //no verifico su cuenta en su correo
             $crite = new Criteria();
             $crite->add(TmpUsuarioRegistroPeer::USUARIO_ID,$user->getId());

             if(TmpUsuarioRegistroPeer::doCount($crite)==0){
                        $this->code_rpt = 'p-10005';
                        return sfView::SUCCESS;                   

                }else{
                   $tmp_user =  TmpUsuarioRegistroPeer::doSelectOne($crite);
                   $this->token    = $tmp_user->getToken();
                   $this->message  = 'El usuario no a verificado su email';
                   $this->code_rpt = 'p-10006';                
                   return sfView::ERROR;
                }
            }else{
                $this->message = 'usuario incorrecto';
                $this->code_rpt = 'p-10007';
                $this->tokenpk = null;
                return sfView::ERROR;
            }
        }else{
               $this->message = 'token incorrecto';
               $this->code_rpt = 'p-10008';
               $this->tokenpk = null;
               return sfView::ERROR;
        }
    }catch (sfValidatorError $exc){
               $this->message = 'error interno consulta fallida';
               $this->code_rpt = 'p-10009';
               $this->tokenpk = null;
               return sfView::ERROR;
     }
}

}
 